#include "BitHandlerInput.h"

//todos mis algoritmos se basan en q vamos a leer y a escribir los bloques tratandolos como si fueran texto...

//luego d la construccion, el objeto ya esta en condiciones d entregar bits
//desde la posicion q se le ha pasado por parametro...

BitHandlerInput::BitHandlerInput(const char* fileName, int pos) {
         //cout << "constructor BitHandlerInput" << endl;
		 archEntrada.open(fileName,ios_base::in|ios::binary);
         archEntrada.seekg(pos);
         indexBitset = 7;
         eofv=false;
         indiceVector = 0;
         llenarBuffer();
         leerSiguienteChar();

         //cout << "fin BitHandlerInput" << endl;

 }

 BitHandlerInput::~BitHandlerInput() {
         archEntrada.close();
 }

 int BitHandlerInput::tellg() {
	 return archEntrada.tellg();
 }

 //posiciona y lee el char correspondiente a esa posicion -> listo para entregar bits
 void BitHandlerInput::seek(int pos) {
         archEntrada.seekg(pos);
         indiceVector = 0;
         llenarBuffer();
         leerSiguienteChar();

 }

 bool BitHandlerInput::siguienteBitEsUno() {

         bool retorno = bitSet[indexBitset];
         indexBitset--;

         if (indexBitset < 0) {
                  leerSiguienteChar();
                  indexBitset = 7;
         }
         //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         //C++ TOMA:
         //0 = FALSE
         //1 = TRUE
         // SI ESO NO GUSTA, SIMPLEMENTE DEVOLVEMOS !retorno (LO INVIERTE)
         // OJO Q SI INVERTIMOS LOS VALORES ACA, HABRA Q INVERTIR TAMBIEN LAS ACCIONES DEL IF EN DONDE SE PREGUNTE EL VALOR
         //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         return retorno;
 }

 void BitHandlerInput::leerSiguienteChar() {
	 cout << "leerSiguienteChar" << endl;


     if (bufferVacio()) {
    	 llenarBuffer();
     }

     bitSet = vectorBuffer[indiceVector];
     indiceVector++;
 }

 bool BitHandlerInput::bufferVacio() {
	 return (indiceVector >= sizeof(vectorBuffer));
 }

 bool BitHandlerInput::eof() {
         return (!archEntrada.good() && bufferVacio());
 }

 void BitHandlerInput::llenarBuffer() {
	 cout << "llenarBuffer" << endl;
	 archEntrada.read(vectorBuffer,sizeof(vectorBuffer));
	 indiceVector = 0;
 }

 // de prueba
 char BitHandlerInput::getCharActual() {
         char charActual = (int)bitSet.to_ulong();
         return charActual;
 }

 void BitHandlerInput::setEof()
 {
     this->eofv=true;
 }

 void BitHandlerInput::resetEof()
 {
     this->eofv=false;
 }

 bool BitHandlerInput::eofVirtual()
 {
     return this->eofv;
 }
